package impl.sdi.persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sdi.model.Mensaje;
import com.sdi.persistence.MensajeDao;
import com.sdi.persistence.exception.AlreadyPersistedException;
import com.sdi.persistence.exception.NotPersistedException;
import com.sdi.persistence.exception.PersistenceException;

public class MsjJdbcDao implements MensajeDao {

	@Override
	public List<Mensaje> getMensajes() {
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		Connection con = null;
		
		List<Mensaje> mensajes = new ArrayList<Mensaje>();

		try {
			// En una implemenntación más sofisticada estas constantes habría 
			// que sacarlas a un sistema de configuración: 
			// xml, properties, descriptores de despliege, etc 
			String SQL_DRV = "org.hsqldb.jdbcDriver";
			String SQL_URL = "jdbc:hsqldb:hsql://localhost";

			// Obtenemos la conexión a la base de datos.
			Class.forName(SQL_DRV);
			con = DriverManager.getConnection(SQL_URL, "sa", "");
			ps = con.prepareStatement("select * from mensaje");
			rs = ps.executeQuery();

			while (rs.next()) {
				Mensaje msj = new Mensaje();
				msj.setTemaId(rs.getString("TEMA_ID"));
				msj.setContenido(rs.getString("CONTENIDO"));
				msj.setFecha(rs.getDate("CREACION"));
				msj.setUserId(rs.getString("USUARIO_ID"));
				
				
				
				mensajes.add(msj);
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new PersistenceException("Driver not found", e);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenceException("Invalid SQL or database schema", e);
		} finally  {
			if (rs != null) {try{ rs.close(); } catch (Exception ex){}};
			if (ps != null) {try{ ps.close(); } catch (Exception ex){}};
			if (con != null) {try{ con.close(); } catch (Exception ex){}};
		}
		
		return mensajes;
	}

	@Override
	public void saveMensaje(Mensaje msj) throws AlreadyPersistedException {
		PreparedStatement ps = null;
		Connection con = null;
		int rows = 0;
		
		try {
			// En una implementación más sofisticada estas constantes habría 
			// que sacarlas a un sistema de configuración: 
			// xml, properties, descriptores de despliege, etc 
			String SQL_DRV = "org.hsqldb.jdbcDriver";
			String SQL_URL = "jdbc:hsqldb:hsql://localhost";

			// Obtenemos la conexión a la base de datos.
			Class.forName(SQL_DRV);
			con = DriverManager.getConnection(SQL_URL, "sa", "");
			ps = con.prepareStatement(
					"insert into mensaje (usuario_id, contenido, creacion, tema_id) " +
					"values (?, ?, ?, ?)");
			
			ps.setString(1, msj.getUserId());
			ps.setString(2, msj.getContenido());
			ps.setDate(3, new java.sql.Date(msj.getFecha().getTime()));
			ps.setString(4, msj.getTemaId());
			

			rows = ps.executeUpdate();
			if (rows != 1) {
				throw new AlreadyPersistedException("Mensaje " + msj.getUserId() + " already persisted");
			} 

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new PersistenceException("Driver not found", e);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenceException("Invalid SQL or database schema", e);
		}
		finally  {
			if (ps != null) {try{ ps.close(); } catch (Exception ex){}};
			if (con != null) {try{ con.close(); } catch (Exception ex){}};
		}
	}

	

	@Override
	public void updateMensaje(Mensaje msj) throws NotPersistedException {
		// TODO Auto-generated method stub

	}

	@Override
	public void deleteMensaje(Mensaje msj) throws NotPersistedException {
		PreparedStatement ps = null;
		Connection con = null;
		int rows = 0;
		
		try {
			// En una implementación más sofisticada estas constantes habría 
			// que sacarlas a un sistema de configuración: 
			// xml, properties, descriptores de despliege, etc 
			String SQL_DRV = "org.hsqldb.jdbcDriver";
			String SQL_URL = "jdbc:hsqldb:hsql://localhost";

			// Obtenemos la conexión a la base de datos.
			Class.forName(SQL_DRV);
			con = DriverManager.getConnection(SQL_URL, "sa", "");
			ps = con.prepareStatement("delete from mensaje where usuario_id = ? and contenido = ? and tema_id = ?");
			
			ps.setString(1, msj.getUserId());
			ps.setString(2,  msj.getContenido());
			ps.setString(3, msj.getTemaId());
			
			
			rows = ps.executeUpdate();
			if (rows != 1) {
				throw new NotPersistedException("Mensaje " + msj.getUserId() + " not found");
			} 
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new PersistenceException("Driver not found", e);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenceException("Invalid SQL or database schema", e);
		}
		finally  {
			if (ps != null) {try{ ps.close(); } catch (Exception ex){}};
			if (con != null) {try{ con.close(); } catch (Exception ex){}};
		}

	}

}
